package com.wang.tool.monitor.template;

import com.wang.tool.common.SimpleException;
import com.wang.tool.monitor.core.MonitorInfo;
import com.wang.tool.common.ErrorInfo;
import com.wang.tool.monitor.weaver.MonitorWeaver;

/**
 * 带监控执行器
 * 有记录出入参诉求建议使用:AbsMonitorInvoker比较通用的异常记录出入参模型
 *
 * @Author wangshaopeng
 * @Date 2022/6/30
 * @see AbsMonitorInvoker
 */
public abstract class MonitorInvoker<R> implements Invoker<R>, MonitorWeaver<R> {

    /**
     * 空入参
     * 不要修改
     */
    public static final Object[] EMPTY_PARAM = new Object[0];

    /**
     * 参数
     * 匿名内部类访问外部数据全部是要final
     * 为了方便调用,解决不必要的包装啥的,可以在创建对象时传入
     */
    private Object[] params;

    public MonitorInvoker() {
    }

    public MonitorInvoker(Object... params) {
        this.params = params;
    }


    /**
     * 执行入参
     * 主要用来记录
     * 该结果会记为执行入参
     *
     * @return 入参
     * @see MonitorInfo#getParams
     * @see MonitorInfo#stepOutMonitor
     */
    public Object[] getParams() {
        return params;
    }

    @Override
    public R handleError(Throwable e, ErrorInfo error) {
        if (e instanceof SimpleException) {
            throw (SimpleException) e;
        }
        if (e instanceof RuntimeException) {
            throw (RuntimeException) e;
        }
        if (e instanceof Error) {
            throw (Error) e;
        }
        throw new SimpleException(e, error.getErrorCode(), error.getErrorMsg());
    }


    @Override
    public void weaveOnAfter(MonitorInfo<R> monitorInfo) throws Throwable {
    }

    @Override
    public void weaveOnBefore(MonitorInfo<R> monitorInfo) throws Throwable {
    }
}
